import os
import stat
import shlex
import subprocess
from typing import Union, List, Tuple, Optional

def run_unitree_example(
        args_list: Union[int, str, List[str], Tuple[str, ...]] = None,
        *,
        exe_path: str = "/home/unitree/fzy/unitree_sdk2-main/build/bin/g1_arm7_sdk_dds_example",
        timeout: Optional[float] = None) -> subprocess.CompletedProcess:
    """
    调用 unitree g1_arm7_sdk_dds_example，空格分隔参数。

    参数
    ----
    args_list : int | str | list/tuple[str]
        单个参数或参数列表/元组。int/str 会被自动转成字符串列表。
    exe_path : str, optional
        可执行文件绝对路径，默认已填好。
    timeout : float, optional
        命令执行超时时间（秒），默认不超时。
    """

    # 1. 参数归一化
    if args_list is None:
        args_list = []
    elif isinstance(args_list, (int, str)):
        args_list = [str(args_list)]
    else:
        args_list = [str(arg) for arg in args_list]

    # 2. 检查并赋予可执行权限
    if not os.access(exe_path, os.X_OK):
        st = os.stat(exe_path)
        os.chmod(exe_path, st.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)

    # 3. 构造 shell 命令
    cmd = f"{exe_path} {' '.join(shlex.quote(arg) for arg in args_list)}"

    # 4. 运行
    return subprocess.run(cmd, shell=True, capture_output=True,
                          text=True, timeout=timeout, check=False)


# ============ 示例用法 ============
if __name__ == "__main__":
    # 1) 仅传一个整数 1
    run_unitree_example(1)
    # # 2) 仅传一个字符串 '1'
    # run_unitree_example("1")
    # # 3) 多个参数
    # run_unitree_example(["1", "hello"])